﻿#define _CRT_SECURE_NO_WARNINGS 1

//#include<iostream>
//using namespace std;
//
//void func(int& x)
//{
//	x++;
//}
//int main()
//{
//	int a = 10;
//	int b = 20;
//	int& c = 30;
//	const int& d = 30;
//	int& e = (a + b);
//	const int& f = (a + b);
//
//	double d = 12.34;
//	//c++规定类型转换会产生临时对象
//	int i = d;
//	int& ri = d;
//	//并且引用后临时对象d的生命周期会跟着ri一起走，ri销毁后d才会销毁
//	//所以不用担心临时对象销毁后引用出了问题
//	//引用的是d的临时对象，具有常性
//	const int& ri = d;
//	
//	//return 0;
//}

//void f(int x)
//{
//	cout << "f(int x)" << endl;
//}
//
//void f(int* x)
//{
//	cout << "f(int* x)" << endl;
//}
//
//int main()
//{
//	f(0);
//	f(NULL);
//	f(nullptr);
//	return 0;
//}

//#include<iostream>
//using namespace std;
//class Date
//{
//public:
//	void Init(int year, int month, int day)
//	{
//		_year = year;
//		_month = month;
//		_day = day;
//	}
//	void Print()
//	{
//		cout << _year << "/" << _month << "/" << _day << endl;
//	}
//private:
//	// 这⾥只是声明，没有开空间
//	int _year;
//	int _month;
//	int _day;
//};

//int main()
//{
//	void& a = nullptr;
//	return 0;
//}

#include<iostream>
using namespace std;
class Date
{
public:
    Date(int year = 1, int month = 1, int day = 1)
    {
        _year = year;
        _month = month;
        _day = day;
    }
    void Print()
    {
        cout << _year << "-" << _month << "-" << _day << endl;
    }

    bool operator==(const Date& d2)
    {
        return this->_year == d2._year
            && this->_month == d2._month
            && this->_day == d2._day;
    }
    //赋值重载：两个已经存在的对象的赋值
    //传值返回会生成一个拷贝，但函数结束后*this还在
    //拷贝且销毁了，白白浪费了一个拷贝，所以返回值传引用
    Date& operator=(const Date& d)
    {
        _year = d._year;
        _month = d._month;
        _day = d._day;
        //this是左操作数的地址 *this就是左操作数
        //形参和实参不能显示写this,函数体内可以写:this->-year但是没必要
        //因为函数体内可以直接写:_year
        //所以返回值是this的一个经典位置
        return *this;
    }
    //拷贝构造:一个已经存在的对象去初始化新创建的对象
    Date(const Date& d)
    {
        _year = d._year;
        _month = d._month;
        _day = d._day;
    }
 private:
    int _year;  
    int _month;
    int _day;
};
// 重载为全局的⾯临对象访问私有成员变量的问题

// 有⼏种⽅法可以解决：
// 1、成员放公有
// 2、Date提供getxxx函数
// 3、友元函数
// 4、重载为成员函数

int main()
{
    //. .* ?: :: sizeof
    Date d1(2024, 7, 5);
    Date d2(2024, 7, 5);
    //赋值重载
    d1 = d2;
    //拷贝构造
    Date d3(d2);
    Date d4 = d2;
    d4 = d3 = d1;
    d4.Print();

    return 0;
}